{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c80a00ef",
      "metadata": {
        "id": "c80a00ef"
      },
      "source": [
        "# Сравнение с соседними числами (7 баллов)\n",
        "\n",
        "Функция `compare` получает один аргумент - целое число `n`, и возвращает запись двойного неравенства этого числа с его соседними целыми числами.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "97241731",
      "metadata": {
        "id": "97241731",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-3c59116c04850c98",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def compare(n):\n",
        "    return f\"{n-1} < {n} < {n+1}\"\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "f94778d0",
      "metadata": {
        "id": "f94778d0",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-56a8f116164f1cfc",
          "locked": true,
          "points": 7,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert compare(5) == '4 < 5 < 6'\n",
        "assert compare(1534) == '1533 < 1534 < 1535'\n",
        "assert compare(0) == '-1 < 0 < 1'\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bc416adf",
      "metadata": {
        "id": "bc416adf"
      },
      "source": [
        "# Закупка парт (7 баллов)\n",
        "\n",
        "В некотором институте решили набрать три новых группы и оборудовать кабинеты для них новыми партами. За каждой партой\n",
        "может сидеть два студента. Известно количество учащихся в каждой из трех групп. Реализуйте функцию `min_desk` для вычисления наименьшего количества парт, которое нужно приобрести для них.\n",
        "\n",
        "В функцию передаются три целых положительных числа `p1`, `p2` и `p3` - количество студентов в каждой из групп.\n",
        "Функция должна возвращать целое число - наименьшее количество парт.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9eabf0ae",
      "metadata": {
        "id": "9eabf0ae",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-bf60678dc2680118",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def min_desk(p1, p2, p3):\n",
        "    if p1%2 != 0:\n",
        "        p1+=1\n",
        "    if p2%2 != 0:\n",
        "        p2+=1\n",
        "    if p3%2 != 0:\n",
        "        p3+=1\n",
        "    return int((p1+p2+p3)/2)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "221736c7",
      "metadata": {
        "id": "221736c7",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-56acff7d3ba54826",
          "locked": true,
          "points": 7,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert min_desk(20, 21, 22) == 32\n",
        "assert min_desk(30, 29, 31) == 46\n",
        "assert min_desk(17, 15, 19) == 27\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0e27265e",
      "metadata": {
        "id": "0e27265e"
      },
      "source": [
        "# Потерянная карточка (7 баллов)\n",
        "\n",
        "Для настольной игры используются карточки с номерами от `1` до `N`. Одна карточка потерялась. Напишите функцию `card_found` для ее нахождения, зная номера оставшихся карточек.\n",
        "\n",
        "В функцию передается список номеров `N − 1` оставшихся карточек (различные числа от `1` до `N`).\n",
        "Функция возвращает номер потерянной карточки.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "02daab0e",
      "metadata": {
        "id": "02daab0e",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-932aec60cd5c3258",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def card_found(list_of_cards):\n",
        "    list_of_cards.sort()\n",
        "    old = 0\n",
        "    for x in list_of_cards:\n",
        "        if x-old == 2:\n",
        "            return x-1\n",
        "        old = x\n",
        "    return x+1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "6d120d66",
      "metadata": {
        "id": "6d120d66",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-9ac7439828d80e96",
          "locked": true,
          "points": 7,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert card_found([1, 2, 3, 4]) == 5\n",
        "assert card_found([4, 1, 7, 8, 3, 5, 9, 10, 6]) == 2\n",
        "assert card_found([1, 2, 5, 4]) == 3\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a10a9b6c",
      "metadata": {
        "id": "a10a9b6c"
      },
      "source": [
        "# Пересечение множеств (7 баллов)\n",
        "\n",
        "Даны два списка чисел. Найдите все числа, которые входят как в первый, так и во второй список и выведите их в порядке возрастания.\n",
        "\n",
        "Функция `intersection` принимает 2 аргумента: 2 списка чисел.\n",
        "Функция возвращает строку из чисел, входящие в оба исходных списка, разделенных запятой.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "72dd78ce",
      "metadata": {
        "id": "72dd78ce",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-a42ac3565b02de9d",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def intersection(list1, list2):\n",
        "    result = list(set(list1) & set(list2))\n",
        "    result.sort()\n",
        "    return ','.join([str(x) for x in result])\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "d78461f3",
      "metadata": {
        "id": "d78461f3",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-34089aece4b9bd2c",
          "locked": true,
          "points": 7,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert intersection([1, 3, 2], [4, 3, 2]) == '2,3'\n",
        "assert intersection([1, 2, 6, 4, 5, 7], [10, 2, 3, 4, 8]) == '2,4'\n",
        "assert intersection([1, 3, 5], [2, 4, 6]) == ''\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8de18285",
      "metadata": {
        "id": "8de18285"
      },
      "source": [
        "# Сумма цифр (7 баллов)\n",
        "\n",
        "Напишите функцию `sum_of_digits`, которая определяет сумму цифр переданного ей числа.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "79a9d2cc",
      "metadata": {
        "id": "79a9d2cc",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-b2cdf750986906ce",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def sum_of_digits(number):\n",
        "    return sum([int(x) for x in list(str(number))])\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2443a242",
      "metadata": {
        "id": "2443a242",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-fb4c29b33c9a4ed1",
          "locked": true,
          "points": 7,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert sum_of_digits(12) == 3\n",
        "assert sum_of_digits(123) == 6\n",
        "assert sum_of_digits(841) == 13\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9af380ae",
      "metadata": {
        "id": "9af380ae"
      },
      "source": [
        "# Банковские проценты (10 баллов)\n",
        "\n",
        "Вклад в банке составляет `x` рублей. Ежегодно он увеличивается на `p` процентов, после чего дробная часть копеек отбрасывается. Реализуйте функцию `bank_rate`, которая, используя простые банковские проценты (т.е. процент на первоначальную сумму), определяет, через сколько лет вклад составит не менее `y` рублей.\n",
        "\n",
        "Функция получает три натуральных числа в качестве аргументов: `x`, `p`, `y`.\n",
        "Функция возвращает одно целое число - количество лет.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "bab4dc86",
      "metadata": {
        "id": "bab4dc86",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-b853904b95426ac3",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def bank_rate(x, p, y):\n",
        "    sum1 = x\n",
        "    index = 0\n",
        "    while sum1<=y:\n",
        "        if sum1<=y:\n",
        "            sum1 = sum1 + x * (p/100)\n",
        "            index += 1\n",
        "    return index\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "bad48350",
      "metadata": {
        "id": "bad48350",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-72741c3963fc8836",
          "locked": true,
          "points": 10,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert bank_rate(100, 100, 200) == 1\n",
        "assert bank_rate(400, 32, 743) == 3\n",
        "assert bank_rate(400, 7, 1046) == 24\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7156984f",
      "metadata": {
        "id": "7156984f"
      },
      "source": [
        "# Стандартное отклонение (10 баллов)\n",
        "\n",
        "Дана последовательность натуральных чисел $x_1, x_2, \\dots, x_n$.\n",
        "Стандартным отклонением называется величина $\\sigma$.\n",
        "\n",
        "$$\\sigma = \\sqrt{{(x_1 - s)^2 + (x_2 - s)^2 + \\dots + (x_n - s)^2}\\over{n - 1}}$$\n",
        "\n",
        "где $s$ – среднее арифметическое последовательности.\n",
        "\n",
        "Реализуйте функцию `std_deviation` для определения стандартного отклонения для списка натуральных чисел.\n",
        "\n",
        "**Внимание:** использовать дополнительные библиотеки и функцию `sum()` запрещается.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "3fc7ec07",
      "metadata": {
        "id": "3fc7ec07",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-f76c9deb9964be8d",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def std_deviation(list_of_numbers):\n",
        "    sum1 = 0\n",
        "    len_list = len(list_of_numbers)\n",
        "    result = 0\n",
        "    # Среднее арифметическое\n",
        "    for x in list_of_numbers:\n",
        "        sum1+=x\n",
        "    s = sum1/len_list\n",
        "    # Стандартное отклонение\n",
        "    for x in list_of_numbers:\n",
        "        result += ((x - s)**2)\n",
        "    return (result/(len_list-1))**0.5\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "4597d8ad",
      "metadata": {
        "id": "4597d8ad",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-c76ddb8dfda7dacc",
          "locked": true,
          "points": 10,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert std_deviation([1, 7, 9]) == 4.163331998932266\n",
        "assert std_deviation([1, 1, 1, 1, 1, 1, 1]) == 0.0\n",
        "assert std_deviation([10, 1, 1, 1, 1, 1]) == 3.6742346141747673\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "df5f40ce",
      "metadata": {
        "id": "df5f40ce"
      },
      "source": [
        "# Сортировка по алфавиту (15 баллов)\n",
        "\n",
        "В списке сотрудников сначала записаны инициалы, а затем фамилии.\n",
        "\n",
        "Реализуйте функцию `last_name_sort`, которая возвращает отсортированный список в алфавитном порядке по фамилии.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8c53a23b",
      "metadata": {
        "id": "8c53a23b",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-375d4f7e649dee6b",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def last_name_sort(list_of_names):\n",
        "    # КОД\n",
        "    return # РЕЗУЛЬТАТ\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c70c8877",
      "metadata": {
        "id": "c70c8877",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-d23f3f6ce1e067e6",
          "locked": true,
          "points": 15,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert last_name_sort(['М.В. Григорьев', 'С.Ю. Рощин', 'М.А. Гильтман']) == ['М.А. Гильтман', 'М.В. Григорьев', 'С.Ю. Рощин']\n",
        "assert last_name_sort(['А.Г. Урядников', 'Б.В. Тепловозов', 'В.Д. Арбузов']) == ['В.Д. Арбузов', 'Б.В. Тепловозов', 'А.Г. Урядников']\n",
        "assert last_name_sort(['A. Smith', 'Ch.H. Dow']) == ['Ch.H. Dow', 'A. Smith']\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3047e718",
      "metadata": {
        "id": "3047e718"
      },
      "source": [
        "# Страны и города (15 баллов)\n",
        "\n",
        "Дан список стран и городов каждой страны. Затем даны названия городов. Реализуйте функцию `get_country`, которая для каждого города определяет в какой стране он находится.\n",
        "\n",
        "Функция принимает 2 аргумента: словарь, ключами которого являются страны, а значениями - перечень городов (строка) и список городов.\n",
        "Функция возвращает список стран.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ca25389b",
      "metadata": {
        "id": "ca25389b",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-e5e4613a3bac3b19",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "def get_country(countries_dict, cities_list):\n",
        "    list_result = []\n",
        "    for city in cities_list:\n",
        "        for key in countries_dict:\n",
        "            list_value = countries_dict[key].split()\n",
        "            if city in list_value:\n",
        "                list_result.append(key)\n",
        "    return list_result\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ef62585a",
      "metadata": {
        "id": "ef62585a",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-bce4cc7e12c8f2fb",
          "locked": true,
          "points": 15,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "assert get_country({'Германия': 'Берлин Гамбург Мюнхен', 'США': 'Нью-Йорк Чикаго'}, ['Чикаго', 'Мюнхен']) == ['США', 'Германия']\n",
        "assert get_country({'Russia': 'Moscow Petersburg Novgorod Kaluga', 'Ukraine': 'Kiev Donetsk Odessa'}, ['Odessa', 'Moscow', 'Novgorod']) == ['Ukraine', 'Russia', 'Russia']\n",
        "assert get_country({'Германия': 'Берлин Гамбург Мюнхен', 'США': 'Нью-Йорк Лос-Анжелес Чикаго', 'Австралия': 'Канберра Арарат Балларат'}, ['Арарат', 'Мюнхен', 'Канберра']) == ['Австралия', 'Германия', 'Австралия']\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e826c74",
      "metadata": {
        "id": "6e826c74"
      },
      "source": [
        "# Список покупок (15 баллов)\n",
        "\n",
        "В файле `DATA.csv` записаны затраты сотрудников в командировке. В первом столбце указано имя сотрудника, во втором - категория затрат, в третьем - сумма затрат. Для подготовки бухгалтерской отчетности необходимо вычислить сумму затрат в каждой из категорий.\n",
        "\n",
        "Реализуйте функцию `cat_report()`, которая считывает данные из файла `DATA.csv` и записывает файл `REPORT.csv`, в первом столбце которого указаны категории затрат, во втором - сумма затрат по категории, заголовки в итоговом файле не нужны.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a52d0024",
      "metadata": {
        "id": "a52d0024",
        "nbgrader": {
          "grade": false,
          "grade_id": "cell-ff55e018f9e90424",
          "locked": false,
          "schema_version": 3,
          "solution": true,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "import csv\n",
        "\n",
        "def cat_report():\n",
        "    food = 0\n",
        "    other = 0\n",
        "    transport = 0\n",
        "    wear = 0\n",
        "    press = 0\n",
        "    with open('DATA.csv') as csvfile:\n",
        "        for list_data in csv.reader(csvfile):\n",
        "            if list_data[1] == \"food\":\n",
        "                food += float(list_data[2])\n",
        "            elif list_data[1] == \"other\":\n",
        "                other += float(list_data[2]) \n",
        "            elif list_data[1] == \"transport\":\n",
        "                transport += float(list_data[2])\n",
        "            elif list_data[1] == \"wear\":\n",
        "                wear += float(list_data[2])\n",
        "            elif list_data[1] == \"press\":\n",
        "                press += float(list_data[2])\n",
        "    data = f\"food;{food};\\nother{other};\\ntransport{transport};wear{wear};\\npress{press}\"\n",
        "    with open('REPORT.csv', 'w', newline='') as csvfile:\n",
        "        csvfile.write(data)\n",
        "\n",
        "cat_report()\n",
        "with open('REPORT.csv') as csvfile:\n",
        "    reader = csv.reader(csvfile)\n",
        "    cat_dict = {}\n",
        "    for line in reader:\n",
        "        print(line)\n",
        "        key, value = line[0].split(';')\n",
        "        cat_dict[key] = float(value)\n",
        "assert cat_dict == {'food': 295.03000000000003,\n",
        "                    'other': 50.64,\n",
        "                    'press': 164.60999999999999,\n",
        "                    'transport': 282.96999999999997,\n",
        "                    'wear': 366.9}\n",
        "'решение зачтено'"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a44191db",
      "metadata": {
        "id": "a44191db",
        "nbgrader": {
          "grade": true,
          "grade_id": "cell-39360d0f146ad581",
          "locked": true,
          "points": 15,
          "schema_version": 3,
          "solution": false,
          "task": false
        }
      },
      "outputs": [],
      "source": [
        "import csv\n",
        "cat_report()\n",
        "with open('REPORT.csv') as csvfile:\n",
        "    reader = csv.reader(csvfile)\n",
        "    cat_dict = {}\n",
        "    for line in reader:\n",
        "        key, value = line[0].split(';')\n",
        "        cat_dict[key] = float(value)\n",
        "assert cat_dict == {'food': 295.03000000000003,\n",
        "                    'other': 50.64,\n",
        "                    'press': 164.60999999999999,\n",
        "                    'transport': 282.96999999999997,\n",
        "                    'wear': 366.9}\n",
        "'решение зачтено'"
      ]
    }
  ],
  "metadata": {
    "celltoolbar": "Create Assignment",
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.11"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
